package com.xuecheng.content.convert;

import com.xuecheng.api.content.model.dto.CourseBaseDTO;
import com.xuecheng.api.content.model.dto.TeachplanDTO;
import com.xuecheng.api.content.model.vo.CourseBaseVO;
import com.xuecheng.api.content.model.vo.TeachplanVO;
import com.xuecheng.content.entity.CourseBase;
import com.xuecheng.content.entity.Teachplan;
import com.xuecheng.content.entity.ext.TeachplanNode;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * po 转 dto
 *
 * @author lily
 * @date 2021/12/08
 */
@Mapper // 不添加这个注解，无法利用反射
public interface TeachplanConvert {

    TeachplanConvert INSTANCE = Mappers.getMapper(TeachplanConvert.class);


    /**
     * 单个实体类转 dto
     *
     * @param teachplanNode
     * @return {@link TeachplanDTO}
     *
     * 这个映射注解应该打在单个映射，因为多个是直接调用的他
     * 第一个参数是dto的参数名字，第二个参数是pojo的名字
     */
    @Mappings({
            @Mapping(target = "teachPlanId", source = "id"),
            @Mapping(target = "teachPlanTreeNodes", source = "childrenNodes")
    })
    TeachplanDTO entity2dto(TeachplanNode teachplanNode);


    /**
     * 多个实体类转 dto
     *
     * @param teachplanNode
     * @return {@link TeachplanDTO}
     *
     * 这个映射注解应该打在单个映射，因为多个是直接调用的他
     * 第一个参数是dto的参数名字，第二个参数是pojo的名字
     */
    List<TeachplanDTO> entities2dtos(List<TeachplanNode> teachplanNode);


    /**
     * 单个 vo 转 dto
     *
     * @param teachplanVO
     * @return {@link TeachplanDTO}
     *
     * 这个映射注解应该打在单个映射，因为多个是直接调用的他
     * 第一个参数是dto的参数名字，第二个参数是pojo的名字
     */
    TeachplanDTO vo2dto(TeachplanVO teachplanVO);


    /**
     * 单个 dto 转 entity
     *
     * @param dto
     * @return {@link TeachplanDTO}
     *
     * 这个映射注解应该打在单个映射，因为多个是直接调用的他
     * 第一个参数是dto的参数名字，第二个参数是pojo的名字
     */
    @Mapping(source = "teachPlanId",target = "id")
    Teachplan dto2entity(TeachplanDTO dto);


    /**
     * 单个 entity 转 dto
     *
     * @param teachplan
     * @return {@link TeachplanDTO}
     *
     * 这个映射注解应该打在单个映射，因为多个是直接调用的他
     * 第一个参数是dto的参数名字，第二个参数是pojo的名字
     *
     * TODO 如果有这个方法，就不需要 TeachplanNode的了吧？
     */
    @Mapping(source = "id",target = "teachPlanId")
    TeachplanDTO entity2dto(Teachplan teachplan);
}
